Leetcode-Sort Problem

Next Permutation(31-Medium)

Description

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place and use only constant extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

Example

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

Solution Code

如果一个数组中的元素从左到右成递减次序,那么就没有一个比它更大的排列,eg.5,4,3,1

首先从数组的右边起,找到a[i]使其右边的部分不再递减。

微信图片_20190309105946.png

微信图片_20190309110001.png

微信图片_20190309105955.png

微信图片_20190309110005.png

微信图片_20190309110010.png

微信图片_20190309110020.png

public class NextPermutation {
    public void nextPermutation(int[] nums) {
        int i = nums.length - 2;
        while(i >= 0 && nums[i] >= nums[i+1]) {
            i--;
        }
        if(i >= 0) {
            int j = nums.length - 1;
            while(j >= 0 && nums[j] <= nums[i]) {
                j--;
            }
            swap(nums, i, j);
        }
        reverse(nums, i + 1);
    }
    public void reverse(int[] nums, int i) {
        int j = nums.length - 1;
        while(i < j) {
            swap(nums, i, j);
            i++;
            j--;
        }
    }
    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

Time Complexity: O(n)
Space Complexity: O(1)